1 '     XREFMOD.BAS modified from XREF.BAS and PRINTER.BAS from BALTIMORE
2 '
3 '     PC VOL. 1.45 from the PC^3 Software Library by
4 '
5 '     Michael Csontos, 3228 Livonia Center Road, Lima, New York 14485
6 '
7 '     August 18, 1982
8 '
9 '
10 LPRINT CHR$(27) "@";
20 LPRINT CHR$(27);"C";CHR$(0);CHR$(11);      'ESC,FORM LENGTH,11 INCHES
30 LPRINT CHR$(15);CHR$(27);CHR$(65);CHR$(9);'COMPRESSED,ESC,LINE FEED,9/72 IN.
50 PRINT "Disk A":FILES "a:*.*":PRINT:PRINT "Disk B":FILES "b:*.*"
60 WIDTH "lpt1:",255
180 PRINT :PRINT "XREF Lists all variables & referenced line #'s as well as the program."
200 PRINT "Initializing_______ ENTER Filename BY   filespec  OR   b:filespec"
220 PRINT "Operate ENTER when last program to be XREF has been entered"
250 DEFINT I-J:LW = 130
260 ON ERROR GOTO 1700
270 DIM RW$(149),PT%(25),F$(20)
280 I = 400: DIM VNXT%(I + 90),V$(I + 90),FRST%(I),LST%(I),RFL%(5 * I),NXT%(5 * I)
320 DATA ABS,AND,ASC,AS,ATN,AUTO,BEEP,CDBL,CHAIN,CHR$,CINT,CIRCLE,CLEAR,CLOSE,CLS,COLOR,COMMON,CONT
330 DATA COS,CSNC,CSRLIN,CVD,CVI,CVS,DATA,DATE$,DEF
340 DATA DEFDBL,DEFINT,DEFSNG,DEFSTR,DELETE,DIM,DRAW
350 DATA EDIT,ELSE,END,EOF,EQV,ERASE,ERL,ERROR,EXP,FIELD,FILES,FIX,FN,FOR
360 DATA FRE,GET,GOSUB,GOTO,HEX$
370 DATA IF,IMP,INKEY$,INPUT,INSTR,INT,KEY,KILL,LEFT$,LEN,LET,LINE
380 DATA LIST,LLIST,LOAD,LOCATE,LOF,LOG,LPOS,LPRINT,LSET,MERGE,MID$,MKD$,MKI$
390 DATA MKS$,MOD,MOTOR,NAME,NEW,NEXT,NOT,OCT$,OFF,ON,OPEN,OPTION,OR,OUT
400 DATA PAINT,PEEK,PEN,PLAY,POINT,POKE,POS,PRESET,PRINT,PSET,PUT
410 DATA RANDOMIZE,READ,REM,RENUM,RESET,RESTORE,RESUME,RETURN,RIGHT$,RND,RSET,RUN
420 DATA SAVE,SCREEN,SGN,SIN,SOUND,SPACE$,SPC(,SQR,STEP,STICK,STOP,STR$,STRIG,STRING$,SWAP,SYSTEM
430 DATA TAB(,TAN,THEN,TIME$,TO,TROFF,TRON
440 DATA USING,USR,VAL,VARPTR,WAIT,WEND,WHILE,WIDTH,WRITE,XOR,"\"
480 RW = 0
490 READ RW$
500 RW = RW + 1: RW$(RW) = RW$: IF RW$ = "\" THEN 550
510 I = ASC(RW$) - ASC("A"): IF PT%(I) = 0 THEN PT%(I) = RW
530 GOTO 490
550 FOR I = 0 TO 25: IF PT%(I) = 0 THEN PT%(I) = RW
560 NEXT
600 FX = 0
610 PRINT :PRINT " ASCII saved program # " FX + 1 " = ";:LINE INPUT L$
612 FOR X=1 TO LEN(L$)' ------- UPPERFY from PRINTER.BAS -----------
614 XC$=MID$(L$,X,1)
616 IF "a" <= XC$ AND XC$ <= "z" THEN MID$(L$,X,1) =CHR$(ASC(XC$)-32)
618 NEXT X'     --------------------------------------------
620 IF L$ = "" THEN IF FX < 1 THEN 780 ELSE 680
630 IF INSTR(L$,".") = 0 THEN L$ = L$ + ".bas"
640 NAME L$ AS L$
650 FX = FX + 1: F$(FX) = L$
660 GOTO 610
680 D$ = DATE$:T$ = TIME$
690 PRINT : INPUT"1) cross reference   2) list   3)both ";M
695 PRINT "Current line being parsed"
730 FOR F = 1 TO FX
740 CLOSE: OPEN"I",1,F$(F):PRG$ = CHR$(34)+F$(F)+CHR$(34)+" - Printed on "+ D$+" at "+T$: GOSUB 820
745 LPRINT CHR$(12)      'form feed      LPRINT STRING$(65 - LZ,CHR$(10))
750 NEXT
780 END
820 LC = 0: BC = 0: PZ = 0: V$ = "": C$ = "": VC = 91: RC = -1:PAGE.LEN = 80
830 FOR I = 0 TO 91: VNXT%(I) = -1: NEXT I
840 IF M > 1 THEN GOSUB 1760
880 IF EOF(1) THEN 1420
890 LINE INPUT#1,L$: IF M > 1 THEN GOSUB 1650: IF M = 2 THEN 880
900 LG = LEN(L$): BRNCH = 0: ER$ = "": LC = LC + 1: BC = BC + LG
910 LP = INSTR(L$," "): LN = VAL(LEFT$(L$,LP)): PRINT LN;
920 IF LN > 32767 THEN LN = LN - 65536!
960 LP = LP + 1: IF LP > LG THEN GOSUB 1220: GOTO 880
970 C$ = MID$(L$,LP,1)
980 IF C$ >= "A" AND C$ <= "Z" THEN 1100 ELSE IF C$ >= "0" AND C$ <= "9" THEN 1360
990 IF C$ = " " THEN GOSUB 1220: GOTO 960 ELSE IF C$ <> ", " THEN BRNCH = 0
1000 IF C$ = CHR$(34) THEN GOSUB 1220: LP = INSTR(LP + 1,L$,C$): IF LP > 0 THEN 960 ELSE 880
1010 IF C$ = "'" THEN GOSUB 1220: GOTO 880
1020 IF C$ = "&" THEN GOSUB 1220: V$ = C$: GOTO 960
1030 IF C$ = "$" OR C$ = "!" OR C$ = "%" OR C$ = "#" THEN GOSUB 1340: GOTO 960
1040 IF C$ = "(" THEN GOSUB 1340
1050 GOSUB 1220: IF C$ <> ", " THEN ER$ = ""
1060 GOTO 960
1100 IF V$ > "" THEN 1370 ELSE C = ASC(C$): P = PT%(C - ASC("A")): BRNCH = 0
1110 IF C < ASC(RW$(P)) THEN 1370
1120 IF INSTR(LP,L$,RW$(P)) <> LP THEN P = P + 1: GOTO 1110
1130 GOSUB 1220: RW$ = RW$(P)
1140 IF RW$ = "DATA" THEN LP = INSTR(LP,L$,": "): IF LP > 0 THEN 960 ELSE 880
1150 IF RW$ = "REM" THEN 880
1160 IF RW$ = "GOTO" OR RW$ = "GOSUB" OR RW$ = "THEN" OR RW$ = "ELSE" OR RW$ = "RESUME" THEN BRNCH = 1
1170 IF RW$ = "ERASE" THEN ER$ = "(" ELSE ER$ = ""
1180 LP = LP + LEN(RW$) - 1: GOTO 960
1220 IF V$ = "" THEN RETURN
1230 IF V$ >= "A" THEN V$ = V$ + ER$: C = ASC(V$) + 1 ELSE IF V$ >= "0" THEN V$ = RIGHT$("    " + V$,5): C = VAL(LEFT$(V$,2)) ELSE 1300
1240 IL = -1: I = C
1250 IF V$ > V$(I) THEN IL = I: I = VNXT%(I): IF I > 0 THEN 1250 ELSE 1270
1260 IF V$ = V$(I) THEN J = LST%(I-91): IF RFL%(J) = LN THEN 1300 ELSE RC = RC + 1: NXT%(J) = RC: GOTO 1290
1270 VC = VC + 1: IF IL >= 0 THEN VNXT%(IL) = VC
1280 V$(VC) = V$: VNXT%(VC) = I: RC = RC + 1: FRST%(VC - 91) = RC: I = VC
1290 RFL%(RC) = LN: NXT%(RC) = -1: LST%(I - 91) = RC
1300 V$ = "": RETURN
1340 IF V$ <> "" THEN V$ = V$ + C$
1350 RETURN
1360 IF V$ = "" AND BRNCH = 0 THEN 960
1370 V$ = V$ + C$: GOTO 960
1420 IF M = 2 THEN RETURN
1422 IF M=1 THEN PZ=0
1424 SINGPG=0:IF M=3 THEN LPRINT:LPRINT:LZ=LZ+2:SINGPG=1
1430 GOSUB 1790           'print page no and header
1440 FOR J = 0 TO 91: V = J
1450 V = VNXT%(V): IF V < 0 THEN 1560
1460 IF LZ > PAGE.LEN THEN GOSUB 1620 ELSE SZ = SZ + 1: IF SZ = 3 THEN GOSUB 1630
1470 RZ = 0: I = FRST%(V - 91): LPRINT V$(V);
1480 IF RZ = 0 THEN LPRINT TAB(16);
1490 LN = RFL%(I): IF LN < 0 THEN LN = LN + 65536!
1500 LPRINT USING "    #####";LN;
1510 RZ = RZ + 1
1520 IF RZ > 12 THEN RZ = 0: LPRINT: LZ = LZ + 1: IF LZ > PAGE.LEN THEN GOSUB 1620
1530 I = NXT%(I): IF I > 0 THEN 1480
1540 IF RZ > 0 THEN LPRINT: LZ = LZ + 1
1550 GOTO 1450
1560 NEXT J
1580 LPRINT STRING$(130, "=")
1590 LPRINT "lines: ";LC;"    bytes: ";BC;"     symbols: ";VC - 91; "references: ";RC + 1
1600 LZ = LZ + 2: RETURN
1620 GOSUB 1750: LPRINT "symbol/line no. ";TAB(20);"reference line":LPRINT STRING$(130,"-"):LZ = LZ + 1
1630 LPRINT :LZ = LZ + 1: SZ = 0: RETURN
1650 X = 1
1660 IF LZ > PAGE.LEN OR RIGHT$(L$,3) = "'PG" THEN GOSUB 1750
1670 Y = INSTR(X,L$,CHR$(10)): IF Y > 0 THEN LPRINT MID$(L$,X,Y - X): LZ = LZ + 1: X = Y + 1: GOTO 1670
1680 LPRINT MID$(L$,X,LW):LZ = LZ + 1: X = X + LW: IF X < LEN(L$) THEN 1680 ELSE RETURN
1700 IF ERR = 53 THEN PRINT:PRINT "file not found": RESUME 610
1710 IF ERR = 58 THEN RESUME 650
1720 IF ERR = 24 THEN RESUME          ' device timeout occurred, continue
1730 ON ERROR GOTO 0
1750 LPRINT CHR$(12)       'form feed     LPRINT STRING$(65 - LZ,CHR$(10))
1760 IF SINGPG=1 THEN LPRINT :SINGPG=0:RETURN ELSE PZ = PZ + 1
1770 LPRINT  CHR$(14) PRG$  "     PAGE" PZ: LPRINT
1780 LZ = 3 : RETURN
1790 GOSUB 1760: LPRINT "symbol/line no. ";TAB(20);"reference line":LZ = LZ + 1
1800 LPRINT STRING$(130,"-"):LZ = LZ + 1: SZ = 0: RETURN
2000 '  SAVE"a:xrefmod.sys",a
